﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CondominioWeb.Persistencia;
using CondominioWeb.Persistencia.NHibernate;
using CondominioWeb.Dominio;

namespace CondominioWeb.Negocio
{
    public class AdministracionService
    {
       public Area_ComunDAO Area_ComunDAO { get; set; }
       public EdificioDAO EdificioDAO {get; set;}
       public ReservaDAO ReservaDAO  {get; set;}
       public ResidenteDAO ResidenteDAO {get; set;}
       public MantenimientoDAO MantenimientoDAO { get; set; }
       public SituacionMantenimientoDAO SituacionMantenimientoDAO {get; set;}
       public SituacionReservaDAO SituacionReservaDAO {get; set;}
       public Tipo_Area_ComunDAO Tipo_Area_ComunDAO {get; set;}
       public Tipo_DocumentoDAO Tipo_DocumentoDAO {get; set;}
       public Tipo_ViviendaDAO Tipo_ViviendaDAO {get; set;}
       public ViviendaDAO ViviendaDAO {get; set;}
       public ZonaDAO ZonaDAO {get; set;}
       

       // Lógica de negocio
       public Residente ResidenteObtener(Int32 nResidente)
       {
           Residente residente = ResidenteDAO.Obtener(nResidente);
           return (residente);
       }
       public Residente RegistrarResidente(Int32 CodigoResidente, Int32 TipoDocumentoResidente, String NumeroDocumento, String NombreResidente, String ApellidoResidente, DateTime FechaNacimiento, String Correo, String ClaveAcceso, String Estado, Int32 TipoResidente)
       {
           Tipo_Documento tipoDocumento = Tipo_DocumentoDAO.Obtener(TipoDocumentoResidente);
           if (tipoDocumento == null)
               throw new Exception("Tipo Documento no registrado...");
           if (ApellidoResidente.Trim() == "")
               throw new Exception("Apellido de residente no ingresado...");
           if (NombreResidente.Trim() == "")
               throw new Exception("Nombres de residente no ingresado...");
           Residente residente = ResidenteDAO.Obtener(CodigoResidente);
           if (residente != null)
               throw new Exception("Residente ya se encuentra registrado...");

           Residente oResidente = new Residente();
           oResidente.CodigoResidente = CodigoResidente;
           oResidente.oTipoDocumentoResidente.Codigo_Tipo_Documento = TipoDocumentoResidente;
           oResidente.NumeroDocumento = NumeroDocumento;
           oResidente.NombreResidente = NombreResidente;
           oResidente.ApellidoResidente = ApellidoResidente;
           oResidente.FechaNacimiento = FechaNacimiento;
           oResidente.Correo = Correo;
           oResidente.ClaveAcceso = ClaveAcceso;
           oResidente.Estado = Estado;
           oResidente.TipoResidente = TipoResidente;

           return ResidenteDAO.Crear(oResidente);
       }
        //INI Angel Llanco
       public Vivienda ViviendaObtener(Int32 CodigoVivienda)
       {
           Vivienda vivienda = ViviendaDAO.Obtener(CodigoVivienda);
           return (vivienda);
       }

       public Vivienda RegistrarVivienda(Int32 CodigoVivienda,
                                         String Descripcion,
                                         Int32 Numero_vivienda,
                                         Double Metraje,
                                         Int32 CodigoEdificio,
                                         Int32 CodigoTipoVivienda,
                                         Int32 CodigoPropietario,
                                         Int32 Codigoresidente,
                                         String Estado)
       {
           Edificio edificio = EdificioDAO.Obtener(CodigoEdificio);
           if (edificio == null)
               throw new Exception("Edificio no registrado...");

           Tipo_Vivienda tipo_vivienda = Tipo_ViviendaDAO.Obtener(CodigoTipoVivienda);
           if (tipo_vivienda == null)
               throw new Exception("Tipo de vivienda no registrado...");

           Residente propietario = ResidenteDAO.Obtener(CodigoPropietario);
           if (propietario == null)
               throw new Exception("Propietario no registrado...");

           Residente residente = ResidenteDAO.Obtener(Codigoresidente);
           if (residente == null)
               throw new Exception("Residente no registrado...");

           Vivienda vivienda = ViviendaDAO.Obtener(CodigoVivienda);
           if (vivienda != null)
               throw new Exception("Vivienda ya se encuentra registrada...");

           Vivienda nuevaVivienda = new Vivienda();

           nuevaVivienda.Codigo_Vivienda = CodigoVivienda;
           nuevaVivienda.Descripcion = Descripcion;
           nuevaVivienda.Numero_Vivienda = Numero_vivienda;
           nuevaVivienda.oEdificio = edificio;
           nuevaVivienda.Metraje = Metraje;
           nuevaVivienda.oTipo_Vivienda = tipo_vivienda;
           nuevaVivienda.oPropietario = propietario;
           nuevaVivienda.oResidente = residente;
           nuevaVivienda.Estado = Estado;

           return ViviendaDAO.Crear(nuevaVivienda);
       }

       public Mantenimiento CuotaObtener(Int32 CodigoCuota)
       {
           Mantenimiento cuota = MantenimientoDAO.Obtener(CodigoCuota);
           return (cuota);
       }

       public Mantenimiento RegistrarCuota(Int32 CodigoCuota,
                                   Int32 CodigoVivienda,
                                   Int32 Anio,
                                   Int32 Mes,
                                   Double Importe,
                                   DateTime FechaEmision,
                                   DateTime FechaVencimiento,
                                   String Observaciones,
                                   Int32 CodigoSituacionMantenimiento,
                                   String Estado)
       {
           Vivienda vivienda = ViviendaDAO.Obtener(CodigoVivienda);
           if (vivienda == null)
               throw new Exception("Vivienda no se encuentra registrada...");

           Situacion_Mantenimiento situacion = SituacionMantenimientoDAO.Obtener(CodigoSituacionMantenimiento);
           if (situacion == null)
               throw new Exception("Situacion de cuota no se encuentra registrada...");

           Mantenimiento mantenimiento = MantenimientoDAO.Obtener(CodigoVivienda);
           if (mantenimiento != null)
           {
               Vivienda viviendaCuota = mantenimiento.oCodigo_Vivienda;
               if (viviendaCuota.Codigo_Vivienda == CodigoVivienda && mantenimiento.Anio == Anio && mantenimiento.Mes == Mes)
                   throw new Exception("Cuota ya se encuentra registrada...");
           }

           Mantenimiento nuevaCuota = new Mantenimiento();

           nuevaCuota.Codigo_Mantenimiento= CodigoCuota;
           nuevaCuota.oCodigo_Vivienda = vivienda;
           nuevaCuota.Anio = Anio;
           nuevaCuota.Mes = Mes;
           nuevaCuota.Importe = Importe;
           nuevaCuota.Fecha_Emision = FechaEmision;
           nuevaCuota.Fecha_Pago = FechaVencimiento;
           nuevaCuota.Observaciones = Observaciones;
           nuevaCuota.oCodigo_Situacion_Mantenimiento = situacion;
           nuevaCuota.Estado = Estado;

           return MantenimientoDAO.Crear(nuevaCuota);
       }
        //FIN Angel Llanco

        //Inicio Gonzalo

       // Servicios básicos area comun
       public Area_Comun CrearAreaComun(Int32 AreCodigo, Int32 areTipoArea, Int32 areZona, Int32 areCapacidad, String areEstado)
       {

           Area_Comun ValidaAreaExiste = ObtenerAreaComun(AreCodigo);
           if (ValidaAreaExiste != null)
               throw new Exception("Código de Area Comun Ya existe");

           Tipo_Area_Comun oTipo_Area_Comun = Tipo_Area_ComunDAO.Obtener(areTipoArea);
           Zona oZona = ZonaDAO.Obtener(areZona);

           Area_Comun oAreaComun = new Area_Comun();
           oAreaComun.Codigo_Area_Comun = AreCodigo;
           oAreaComun.oTipo_Area_Comun = oTipo_Area_Comun;
           oAreaComun.oZona = oZona;
           oAreaComun.Capacidad = areCapacidad;
           oAreaComun.Estado = areEstado;
           return Area_ComunDAO.Crear(oAreaComun);
       }

       public Area_Comun ObtenerAreaComun(Int32 areCodigo)
       {
           return Area_ComunDAO.Obtener(areCodigo);
       }


       public Vivienda ObtenerVivienda(Int32 vivCodigo)
       {
           return ViviendaDAO.Obtener(vivCodigo);
       }

       public Area_Comun ModificarAreaComun(Int32 AreCodigo, Int32 areTipoArea, Int32 areZona, Int32 areCapacidad, String areEstado)
       {

           Area_Comun ValidaAreaExiste = ObtenerAreaComun(AreCodigo);
           if (ValidaAreaExiste == null)
               throw new Exception("Código de Area Comun no válido");

           Tipo_Area_Comun oTipo_Area_Comun = Tipo_Area_ComunDAO.Obtener(areTipoArea);
           Zona oZona = ZonaDAO.Obtener(areZona);

           Area_Comun oAreaComun = new Area_Comun();
           oAreaComun.Codigo_Area_Comun = AreCodigo;
           oAreaComun.oTipo_Area_Comun = oTipo_Area_Comun;
           oAreaComun.oZona = oZona;
           oAreaComun.Capacidad = areCapacidad;
           oAreaComun.Estado = areEstado;

           return Area_ComunDAO.Modificar(oAreaComun);
       }

       public void EliminarAreaComun(Int32 AreCodigo)
       {

           Area_Comun ValidaAreaExiste = ObtenerAreaComun(AreCodigo);
           if (ValidaAreaExiste == null)
               throw new Exception("Código de Area Comun no válido");

           Area_Comun oAreaComun = new Area_Comun();
           oAreaComun.Codigo_Area_Comun = AreCodigo;
           oAreaComun.oTipo_Area_Comun = ValidaAreaExiste.oTipo_Area_Comun;
           oAreaComun.oZona = ValidaAreaExiste.oZona;
           oAreaComun.Capacidad = ValidaAreaExiste.Capacidad;
           oAreaComun.Estado = ValidaAreaExiste.Estado;

           Area_ComunDAO.Eliminar(oAreaComun);
       }

        

       // Servicios avanzados
       public ICollection<Area_Comun> ListarTodasAreasComunes()
       {
           return Area_ComunDAO.ListaAreasComunes("");
       }

       // Listar todas las viviendass
       public ICollection<Vivienda> ListarTodasViviendas()
       {
           return ViviendaDAO.ListarViviendaPorDescripcion("");
       }
        //Metodos para la reserva

       // Servicios básicos
       public Reserva CrearReserva(Int32 rsvCodigo, DateTime rsvFecha, Int32 rsvAreaComun, Int32 rsvCantidadPersonas, String rsvResponsable, DateTime rsvFechaSeparacion, Int32 rsvSituacion, String rsvEstado)
       {

           Area_Comun oArea_Comun = Area_ComunDAO.Obtener(rsvAreaComun);
           Situacion_Reserva oSituacion_Reserva = SituacionReservaDAO.Obtener(rsvSituacion);

           if (oArea_Comun != null)
           {
               ICollection<Reserva> oValidaReserva = ObtenerAreaComunXFecha(oArea_Comun, rsvFechaSeparacion);
               if (oValidaReserva.Count > 0)
                   throw new Exception("El area comun ya fue reservado para el dia " + rsvFechaSeparacion.ToString());
           }
           ICollection<Reserva> oValidaResidenteDia = ObtenerAreaComunXResidente(rsvAreaComun.ToString(), rsvFechaSeparacion);
           if (oValidaResidenteDia.Count > 0)
               throw new Exception("El residente ya tiene reserva para el dia " + rsvFechaSeparacion.ToString());


           
           Reserva oReserva = new Reserva();
           oReserva.Codigo = rsvCodigo;
           oReserva.Fecha = rsvFecha;
           oReserva.oAreaComun = oArea_Comun;
           oReserva.CantidadPersonas = rsvCantidadPersonas;
           oReserva.Responsable = rsvResponsable;
           oReserva.FechaSeparacion = rsvFechaSeparacion;
           oReserva.oSituacion = oSituacion_Reserva;
           oReserva.Estado = rsvEstado;

           return ReservaDAO.Crear(oReserva);
       }

       public Reserva ObtenerReserva(Int32 reserva)
       {
           return ReservaDAO.Obtener(reserva);
       }

       public ICollection<Reserva> ObtenerAreaComunXFecha(Area_Comun rsvAreaComun, DateTime rsvFechaSeparacion)
       {
           
           return ReservaDAO.ReservaAreaComunXFecha(rsvAreaComun, rsvFechaSeparacion);
       }

       public ICollection<Reserva> ObtenerAreaComunXResidente(String Residente, DateTime rsvFechaSeparacion)
       {

           return ReservaDAO.ReservaAreaComunXCliente(Residente, rsvFechaSeparacion);
       }

       public Reserva ModificarAreaComun(Reserva reserva)
       {
           return ReservaDAO.Modificar(reserva);
       }

       public void EliminarAreaComun(Reserva reserva)
       {
           ReservaDAO.Eliminar(reserva);
       }

       // Servicios avanzados
       public ICollection<Reserva> ListarTodasReservas()
       {
           return ReservaDAO.ListaTodasReservas("");
       }

    }
}